#include <iostream>
#include <vector>
#include <queue>
using namespace std;

const int N = 110;

int n;
vector<int> edges[N];

int fa[N]; // fa[i]表示i这个点的父亲是谁
int dist[N]; // dist[i]表示i这个点到x的最短距离

//求深度(高度)
//树高 = max(子树的高度)+1
int dfs(int u)
{
	int ret = 0;//所有子树深度的最大值
	for(auto v : edges[u])
	{
		ret = max(ret, dfs(v));
	}
	return ret + 1;
}

//求宽度
int bfs()
{
	queue<int> q;
	q.push(1);

	int ret = 0;
	
	while(q.size())
	{
		int sz = q.size();
		ret = max(ret, sz);

		//出一层，入一层
		while(sz--)
		{
			int t = q.front(); q.pop();
			//让t的子节点入队
			for(auto v : edges[t])
			{
				q.push(v);
			}
		}
	}

	return ret;
}

int main()
{
	cin >> n;
	for(int i = 1; i < n; i++)
	{
		int u, v; cin >> u >> v;
		edges[u].push_back(v);
		fa[v] = u;
	}

	//求深度
	cout << dfs(1) << endl;

	//求宽度
	cout << bfs() << endl;

	//求距离
	//1.先从 x 向上爬，同时标记路径中，所有的点到x的距离
	//2.接下来从y开始向上爬，当第一次遇到标记点时，更新结果
	//1)向上爬？ int fa[N]; fa[i]表示i这个点的父亲是谁
	//2)如何标记当前点到x的距离？ int dist[N]; dist[i]表示i这个点到x的最短距离
	//3)如何标记y到相遇点的距离? int len = 0
	int x, y; cin >> x >> y;
	//当x还可以向上爬的时候，更新父结点
	while(x != 1)
	{
		dist[fa[x]] = dist[x] + 1;
		x = fa[x];
	}

	int len = 0;
	while(y != 1 && dist[y] == 0)
	{
		y = fa[y];
		len++;
	}
	cout << dist[y] * 2 + len << endl;

	return 0;
}

